package codewars.arrays;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * PickPeaks
 * CodeWars: https://www.codewars.com/kata/pick-peaks/train/java
 * Topics: algorithms, arrays, map/reduce
 *
 * 目前还没明白如何 map/reduce
 *
 * 给一个正整数的字符串，字符串大小代表高低。
 * 找到其中的 "峰"(peak) 并且把峰的idx 和 value 分别放入 pos 和 peak中，然后总结果map返回
 *
 * 注意：
 * 1）第一个和最后一个元素，不算做峰
 * 2）对于  1,2,2,2,1      这样的情况，要取第一个2出现时候的 pos 和 peak
 * 3）对于 1,2,2,2}        这样结束了的，不算峰
 * 4）对于 1,2,2,3,3       这样的 2就不算峰
 *
 *
 * Created by yzy on 2019-05-11 17:03
 */
public class PickPeaks {

    public static void main(String[] args) {
        int[] arr = new int[]{3,2,3,6,4,1,2,3,2,1,2,2,2,1};
        System.out.println(getPeaks(arr));
    }

    public static Map<String, List<Integer>> getPeaks(int[] arr) {
        Map<String, List<Integer>> map = new HashMap<>(4);
        List<Integer> pos = new ArrayList<>();
        List<Integer> peaks = new ArrayList<>();


        map.put("pos",pos);
        map.put("peaks", peaks);
        return map;
    }

    /**
     *
     * @param arr
     * @return
     */
    public static Map<String, List<Integer>> getPeaks_1(int[] arr) {
        Map<String, List<Integer>> map = new HashMap<>(4);
        List<Integer> pos = new ArrayList<>();
        List<Integer> peaks = new ArrayList<>();

        int topIdx = 0;
        for(int i=1; i<arr.length; i++){
            if(arr[i] > arr[i-1]){
                topIdx = i;
            }
            if(topIdx !=0 && arr[topIdx] > arr[i]){
                pos.add(topIdx);
                peaks.add(arr[topIdx]);
                topIdx = 0;
            }
        }

        map.put("pos",pos);
        map.put("peaks", peaks);
        return map;
    }
}
